package com.gxa.service.impl;

import com.gxa.dao.BuildDao;
import com.gxa.dao.CommunityDao;
import com.gxa.dao.impl.BuildDaoImpl;
import com.gxa.dao.impl.CommunityDaoImpl;
import com.gxa.entity.Build;
import com.gxa.exception.ErrorType;
import com.gxa.exception.ServiceException;
import com.gxa.service.BuildService;
import com.gxa.service.CommunityService;
import com.gxa.utils.DBConnection;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * 栋数 业务逻辑层 实现类
 */
public class BuildServiceImpl implements BuildService {
    private BuildDao buidDao = new BuildDaoImpl();
    private CommunityDao communityDao = new CommunityDaoImpl();
    @Override
    public List<Build> queryAllBuidByCommu(String cid, String cname) throws SQLException {
        // 1、非空校验
        int cidToInt = 0;
        if (cid == null || cid.trim().isEmpty()) {
            cidToInt = 0;
        } else {
            // 2、格式转换
            cidToInt = Integer.parseInt(cid);
        }
        // 2、格式转换
//        int cidToInt = Integer.parseInt(cid);

        // 3、封装参数为对象
        Build build = new Build(cidToInt, cname, null);

        // 4、调用数据持久层 BuildDao

        List<Build> builds = buidDao.selectAllBuildByComm(build);

        return builds;
    }

    @Override
    public List<Build> queryAllUnitByBuildAndComm(String cid, String bname) throws SQLException {
        // 1、非空校验
        int cidToInt = 0;
        if (cid == null || cid.trim().isEmpty()) {
            cidToInt = 0;
        } else {
            // 2、格式转换
            cidToInt = Integer.parseInt(cid);
        }
        // 2、格式转换
//        int cidToInt = Integer.parseInt(cid);

        // 3、封装参数为对象
        Build build = new Build(cidToInt, bname, null);

        // 4、调用数据持久层 BuildDao

        List<Build> builds = buidDao.selectAllUnitByBuildAndComm(build);

        return builds;
    }

    @Override
    public List<Build> queryAllBuid() throws SQLException {
        return buidDao.selectAllBuild();
    }

    @Override
    public List<Build> queryAllBuildByPage(String page, String limit) throws SQLException {
        // 1、非空校验
        if (page == null || page.trim().isEmpty()) {
            throw new ServiceException(ErrorType.EMPTY_QUERY_PAGE);
        }
        if (limit == null || page.trim().isEmpty()) {
            throw new ServiceException(ErrorType.EMPTY_QUERY_PAGE);
        }
        // 2、参数转换
        int pageToInt = Integer.parseInt(page);
        int limitToInt = Integer.parseInt(limit);
        // 3、调用Dao完成业务
        List<Build> buildList = buidDao.selectAllBuildByPage(pageToInt, limitToInt);
        return buildList;
    }

    @Override
    public int queryCounts() throws SQLException {
        return buidDao.selectCounts();
    }

    @Override
    public boolean addBuild(Build build) {
        // 1、非空校验
        if (build.getBname() == null || build.getBname().trim().isEmpty()) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getUnit() == null) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getUnitNum() == null) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getCommunity().getCid() == null) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        /*if (build.getCommunity().getRemark() == null || build.getCommunity().getRemark().trim().isEmpty()) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
*/

        // 2、调用Dao完成业务逻辑（注意，由于此处新增涉及到多张表的增加操作，所以得用事务进行控制）
        try (Connection connection = DBConnection.getConnection()) { // 在JDK7优化后的try-with-resource语句，该语句确保了每个资源,在语句结束时,()中实现了自动关闭接口AutoCloseable的对象都被关闭。
            System.out.println("service层的conn===>"+connection);
            // 资源自动管理：将继承了AutoCloseable接口的类放在try()，其执行完毕后会自动关闭

            // 开启事务（需要使用Connection对象）
            connection.setAutoCommit(false);
            // 先新增
            int count = buidDao.insertBuild(build);
            if (build.getCommunity().getRemark() != null && !build.getCommunity().getRemark().trim().isEmpty()){
                count += communityDao.updateRemarkInCommunity(build.getCommunity());

                if (count != 2){
                    throw new ServiceException(10015,"新增栋数异常");
                }
            }

            // 提交事务
            connection.commit();
        } catch (SQLException e) {
            // 出现异常不回滚事务，会有问题吗？不会，因为上面没有到执行提交
            //throw new RuntimeException(e);
            throw new ServiceException(10015,"新增栋数异常!");
        }
        return true;
    }

    @Override
    public boolean editBuildByBuild(Build build) {
        // 1、非空校验
        if (build.getBname() == null || build.getBname().trim().isEmpty()) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getUnit() == null) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getUnitNum() == null) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getCommunity().getCid() == null) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }
        if (build.getBid() == null || build.getBid() == 0) {
            throw new ServiceException(ErrorType.EMPTY_PARAMETERS);
        }

        // 2、调用Dao完成业务逻辑（注意，由于此处新增涉及到多张表的增加操作，所以得用事务进行控制）
        try (Connection connection = DBConnection.getConnection()) { // 在JDK7优化后的try-with-resource语句，该语句确保了每个资源,在语句结束时,()中实现了自动关闭接口AutoCloseable的对象都被关闭。
            System.out.println("service层的conn===>"+connection);
            // 资源自动管理：将继承了AutoCloseable接口的类放在try()，其执行完毕后会自动关闭

            // 开启事务（需要使用Connection对象）
            connection.setAutoCommit(false);
            // 先修改
            int count = buidDao.editBuild(build);
            if (build.getCommunity().getRemark() != null && !build.getCommunity().getRemark().trim().isEmpty()){
                count += communityDao.updateRemarkInCommunity(build.getCommunity());

                if (count != 2){
                    throw new ServiceException(10015,"新增栋数异常");
                }
            }

            // 提交事务
            connection.commit();
        } catch (SQLException e) {
            // 出现异常不回滚事务，会有问题吗？不会，因为上面没有到执行提交
            //throw new RuntimeException(e);
            throw new ServiceException(10015,"新增栋数异常!");
        }
        return true;

    }

    @Override
    public boolean delBuildByBid(String bid) {
        // 1、非空校验
        if (bid == null || bid.trim().isEmpty() || Integer.parseInt(bid) == 0) {
            throw new ServiceException(10019,"bid不能为空，且值不能为0");
        }
        // 2、参数类型转换
        Integer bidToInteger = Integer.valueOf(bid);
        // 3、调用Dao完成业务逻辑

        return buidDao.delBuildByBid(bidToInteger) != 0;
    }
}